package com.specter.mvc.model.service;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import com.specter.utils.BeanUtils;

/**
 * Note:条件构造器
 * 
 * @author Liang.Wang
 * @version Mar 16, 2017
 */
public class Restrictions {

	private Map<String, Object> params;
	private Map<String, String> orders;

	/**
	 * 构造对象
	 * 
	 * @return 实例化对象
	 */
	public static Restrictions me() {
		Restrictions obj = new Restrictions();
		obj.params = new HashMap<>();
		obj.orders = new LinkedHashMap<>();
		obj.params.put("orders_", obj.orders);
		return obj;
	}

	/**
	 * 构造参数
	 * 
	 * @return 参数map
	 */
	public Map<String, Object> params() {
		return this.params;
	}

	/**
	 * 构造排序
	 * 
	 * @return 排序map
	 */
	public Map<String, String> orders() {
		return this.orders;
	}

	/**
	 * 设置动态表名
	 * 
	 * @param tableName 表名
	 * @return 本身（方便链式操作）
	 */
	public Restrictions table(String tableName) {
		this.params.put("tableName", tableName);
		return this;
	}

	/**
	 * 设置操作对象
	 * 
	 * @param object 对象值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions object(Object object) {
		this.params.putAll(BeanUtils.obj2Map(object));
		return this;
	}

	/**
	 * 字段升序
	 * 
	 * @param columnName 数据库字段名
	 * @return 本身（方便链式操作）
	 */
	public Restrictions asc(String columnName) {
		this.orders.put(columnName, "ASC");
		return this;
	}

	/**
	 * 字段降序
	 * 
	 * @param columnName 数据库字段名
	 * @return 本身（方便链式操作）
	 */
	public Restrictions desc(String columnName) {
		this.orders.put(columnName, "DESC");
		return this;
	}

	/**
	 * 属性相等
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions eq(String propertyName, Object value) {
		this.params.put(propertyName, value);
		return this;
	}

	/**
	 * 属性不相等
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions ne(String propertyName, Object value) {
		System.out.println("Not Supported!");
		return this;
	}

	/**
	 * 属性大于
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions gt(String propertyName, Object value) {
		System.out.println("gt Not Supported!");
		return this;
	}

	/**
	 * 大于等于
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions ge(String propertyName, Object value) {
		System.out.println("ge Not Supported!");
		return this;
	}

	/**
	 * 属性小于
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions lt(String propertyName, Object value) {
		System.out.println("lt Not Supported!");
		return this;
	}

	/**
	 * 小于等于
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions le(String propertyName, Object value) {
		System.out.println("le Not Supported!");
		return this;
	}

	/**
	 * like查询: 在 value 值中自主设置
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions like(String propertyName, Object value) {
		value = value.toString().contains("%") ? value : ("%" + value + "%");
		this.params.put(propertyName, value);
		return this;
	}

	/**
	 * like查询: '%value%'
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions ilike(String propertyName, Object value) {
		this.params.put(propertyName, "%" + value + "%");
		return this;
	}

	/**
	 * like查询: 'value%'
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions llike(String propertyName, Object value) {
		this.params.put(propertyName, value + "%");
		return this;
	}

	/**
	 * like查询: '%value'
	 * 
	 * @param propertyName 属性名
	 * @param value        属性值
	 * @return 本身（方便链式操作）
	 */
	public Restrictions rlike(String propertyName, Object value) {
		this.params.put(propertyName, "%" + value);
		return this;
	}

}
